<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>

        
        // function Person(name){
        //     this.name = name;
        // }
        // let instance = null; // 准备一个变量 初始值定为null  空 
        // function singleten(username){
        //     // 判断 只要 new 过  就不再new  没有new 创建一个 
        //     if(instance == null){
        //         instance = new Person(username)
        //     }
        //     return instance
        // }
        // 单例模式  需求 1 

        // 变量私有化  
        //   延长instance的生命周期  让instance持久保存 闭包 
        //   能用到    singleten 函数    -> 函数内返回一个函数  闭包 


        // function outer(){
        //     let instance = null; 
        //     return function singleten(username){
        //         // if(instance == null){
        //         if(!instance){

        //             instance = new Person(username)
        //         }

        //         return instance
        //     }

        // }

        // const  res = outer();
        //res得到的是什么  
        // singleten()函数  

        // const p1 = res('张三');
        // const p2 = res('李四');
        // console.log(p1===p2);

        // outer 函数 除了  在  const  res = outer();这里使用一次
        // 后边没用了  
        // 既然一次性的 索性用一个自执行函数代替outer

    //     function Person(name){
    //         this.name = name;
    //     }
    //     var p1 = (function(){
    //    let instance = null; 
    //         return function singleten(username){
    //             // if(instance == null){
    //             if(!instance){

    //                 instance = new Person(username)
    //             }

    //             return instance
    //      }})();

        //  console.log(p1('张三')); // singleten函数 
        //  console.log(p1('李四')); // singleten函数 
        //  console.log(p1('李四1')); // singleten函数 
        //  console.log(p1('李四2')); // singleten函数 
        //  console.log(p1('李四3')); // singleten函数 
        //  console.log(p1('李四4')); // singleten函数 

         


        //Person放在外边  难免 绕开  自执行函数 自己去实例化 
        // 于是失去了单例设计模式的意义  


        // 所以Person不能放在外边 

        var res = (function(){
            function Person(name){
                    this.name = name;
                }
            // 单例核心代码 
            let instance = null;
            return function singleten(username){
                if(!instance){

                    instance = new Person(username)
                }

                return instance
            }
        })();


        // res 得到的是singleten 函数

        const p1 = res('张三');
        const p2 = res('李四');

        console.log(p1,p2);

    </script>
</body>
</html>